// Copyright (c) 2023, the Dart project authors.  Please see the AUTHORS file
// for details. All rights reserved. Use of this source code is governed by a
// BSD-style license that can be found in the LICENSE file.

import 'dart:ffi';
import 'dart:io';

import 'package:ffi/ffi.dart';

void main() {
  if (Platform.isWindows || Platform.isAndroid) {
    // printf is not linked in.
    return;
  }
  using((arena) {
    printf('Something\n'.toNativeUtf8(allocator: arena));
    printfInt32('Something %i\n'.toNativeUtf8(allocator: arena), 32);
    printfInt32x2('Something %i %i\n'.toNativeUtf8(allocator: arena), 32, 64);
  });
}

final printf = DynamicLibrary.executable()
    .lookupFunction<
      Void Function(Pointer<Utf8>, VarArgs<()>),
      void Function(Pointer<Utf8>)
    >('printf');

final printfInt32 = DynamicLibrary.executable()
    .lookupFunction<
      Void Function(Pointer<Utf8>, VarArgs<(Int32,)>),
      void Function(Pointer<Utf8>, int)
    >('printf');

final printfInt32x2 = DynamicLibrary.executable()
    .lookupFunction<
      Void Function(Pointer<Utf8>, VarArgs<(Int32, Int32)>),
      void Function(Pointer<Utf8>, int, int)
    >('printf');
